/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucue.ptc.gco.ngc;

import edu.ucue.ptc.gco.dao.LoteDAOLocal;
import edu.ucue.ptc.gco.mdl.Lote;
import edu.ucue.ptc.gco.mdl.Producto;
import edu.ucue.ptc.gco.util.AtributoInvalidoException;
import edu.ucue.ptc.gco.util.ElementoYaExisteException;
import edu.ucue.ptc.gco.util.ValidarAtributoUtil;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateful;
import javax.inject.Inject;
import javax.inject.Named;

/**
 * @author edwin
 */
@Stateful
@Named(value = "loteManager")
public class LoteManager implements LoteManagerLocal {

    @Inject
    private LoteDAOLocal loteDao;
    @EJB
    private UsuarioManagerLocal ejbRefUsuario;
    @EJB
    private ProductoManagerLocal ejbRefProducto;

    @Override
    public void crearLote(Lote lote, String usuario, String password) throws AtributoInvalidoException, ElementoYaExisteException, Exception {
        ejbRefUsuario.existeUsuario(usuario, password);
        ValidarAtributoUtil.validarObjetoNulo("lote", lote);
        ValidarAtributoUtil.validarObjetoNulo("producto", lote.getProducto());

        Lote l = loteDao.obtenerPorId(lote.getIdLote());
        if (l != null) {
            throw new ElementoYaExisteException("Lote con id " + l.getIdLote() + " ya existe.");
        } else if (lote.getCantidadActual() > lote.getCantidadInicial()) {
            throw new AtributoInvalidoException("cantidadActual", lote.getCantidadActual(), "La cantidad actual sobrepasa la inicial");
        } else if (lote.getCantidadActual() < 0) {
            throw new AtributoInvalidoException("cantidadActual", lote.getCantidadActual(), "La cantidad actual es negativa");
        } else if (lote.getCantidadInicial() < 0) {
            throw new AtributoInvalidoException("cantidadInicial", lote.getCantidadInicial(), "La cantidad inicial es negativa");
        } else if (lote.getCostoVenta() < 0) {
            throw new AtributoInvalidoException("costoVenta", lote.getCostoVenta(), "El costo venta es negativo");
        }
        Producto p = ejbRefProducto.obtenerPorId(lote.getProducto().getIdProducto(), usuario, password);
        if (p == null) {
            throw new AtributoInvalidoException("producto", "", "El producto del lote no existe");
        }
        lote.setProducto(p);
        p.getLotes().add(lote);
        loteDao.crear(lote);
        ejbRefProducto.actualizar(p, usuario, password);

    }

    @Override
    public Lote crearLoteT(Lote lote, String usuario, String password) throws AtributoInvalidoException, ElementoYaExisteException, Exception {
        ejbRefUsuario.existeUsuario(usuario, password);
        ValidarAtributoUtil.validarObjetoNulo("lote", lote);
        ValidarAtributoUtil.validarObjetoNulo("producto", lote.getProducto());

        Lote l = loteDao.obtenerPorId(lote.getIdLote());
        if (l != null) {
            throw new ElementoYaExisteException("Lote con id " + l.getIdLote() + " ya existe.");
        } else if (lote.getCantidadActual() > lote.getCantidadInicial()) {
            throw new AtributoInvalidoException("cantidadActual", lote.getCantidadActual(), "La cantidad actual sobrepasa la inicial");
        } else if (lote.getCantidadActual() < 0) {
            throw new AtributoInvalidoException("cantidadActual", lote.getCantidadActual(), "La cantidad actual es negativa");
        } else if (lote.getCantidadInicial() < 0) {
            throw new AtributoInvalidoException("cantidadInicial", lote.getCantidadInicial(), "La cantidad inicial es negativa");
        } else if (lote.getCostoVenta() < 0) {
            throw new AtributoInvalidoException("costoVenta", lote.getCostoVenta(), "El costo venta es negativo");
        }
        Producto p = ejbRefProducto.obtenerPorId(lote.getProducto().getIdProducto(), usuario, password);
        if (p == null) {
            throw new AtributoInvalidoException("producto", "", "El producto del lote no existe");
        }
        loteDao.crear(lote);
        
        return lote;
    }
    
    @Override
    public void actualizarLote(Lote lote, String usuario, String password) throws AtributoInvalidoException, Exception {
        ejbRefUsuario.existeUsuario(usuario, password);
        ValidarAtributoUtil.validarObjetoNulo("lote", lote);
        ValidarAtributoUtil.validarObjetoNulo("producto", lote.getProducto());

        Lote l = loteDao.obtenerPorId(lote.getIdLote());
        if (l == null) {
            throw new AtributoInvalidoException("lote", lote.getIdLote(), "Lote con id " + lote.getIdLote() + " debe existir.");
        } else if (lote.getCantidadActual() > lote.getCantidadInicial()) {
            throw new AtributoInvalidoException("cantidadActual", lote.getCantidadActual(), "La cantidad actual sobrepasa la inicial");
        } else if (lote.getCantidadActual() < 0) {
            throw new AtributoInvalidoException("cantidadActual", lote.getCantidadActual(), "La cantidad actual es negativa");
        } else if (lote.getCantidadInicial() < 0) {
            throw new AtributoInvalidoException("cantidadInicial", lote.getCantidadInicial(), "La cantidad inicial es negativa");
        } else if (lote.getCostoVenta() < 0) {
            throw new AtributoInvalidoException("costoVenta", lote.getCostoVenta(), "El costo venta es negativo");
        }
        Producto p = ejbRefProducto.obtenerPorId(lote.getProducto().getIdProducto(), usuario, password);
        if (p == null) {
            throw new AtributoInvalidoException("producto", "", "El producto del lote no existe");
        }
        loteDao.actualizar(lote);
    }

    @Override
    public Lote actualizarLoteT(Lote lote, String usuario, String password) throws AtributoInvalidoException, Exception {
        ejbRefUsuario.existeUsuario(usuario, password);
        ValidarAtributoUtil.validarObjetoNulo("lote", lote);
        ValidarAtributoUtil.validarObjetoNulo("producto", lote.getProducto());

        Lote l = loteDao.obtenerPorId(lote.getIdLote());
        if (l == null) {
            throw new AtributoInvalidoException("lote", lote.getIdLote(), "Lote con id " + lote.getIdLote() + " debe existir.");
        } else if (lote.getCantidadActual() > lote.getCantidadInicial()) {
            throw new AtributoInvalidoException("cantidadActual", lote.getCantidadActual(), "La cantidad actual sobrepasa la inicial");
        } else if (lote.getCantidadActual() < 0) {
            throw new AtributoInvalidoException("cantidadActual", lote.getCantidadActual(), "La cantidad actual es negativa");
        } else if (lote.getCantidadInicial() < 0) {
            throw new AtributoInvalidoException("cantidadInicial", lote.getCantidadInicial(), "La cantidad inicial es negativa");
        } else if (lote.getCostoVenta() < 0) {
            throw new AtributoInvalidoException("costoVenta", lote.getCostoVenta(), "El costo venta es negativo");
        }
        Producto p = ejbRefProducto.obtenerPorId(lote.getProducto().getIdProducto(), usuario, password);
        if (p == null) {
            throw new AtributoInvalidoException("producto", "", "El producto del lote no existe");
        }
        loteDao.actualizar(lote);
        
        return lote;
    }
    
    @Override
    public void eliminarLote(Lote lote, String usuario, String password) throws AtributoInvalidoException, Exception {
        ejbRefUsuario.existeUsuario(usuario, password);
        ValidarAtributoUtil.validarObjetoNulo("lote", lote);

        Lote l = loteDao.obtenerPorId(lote.getIdLote());
        if (l == null) {
            throw new AtributoInvalidoException("lote", lote.getIdLote(), "Lote con id " + lote.getIdLote() + " debe existir.");
        }
        loteDao.eliminar(lote);
    }

    @Override
    public Lote eliminarLoteT(Lote lote, String usuario, String password) throws AtributoInvalidoException, Exception {
        ejbRefUsuario.existeUsuario(usuario, password);
        ValidarAtributoUtil.validarObjetoNulo("lote", lote);

        Lote l = loteDao.obtenerPorId(lote.getIdLote());
        if (l == null) {
            throw new AtributoInvalidoException("lote", lote.getIdLote(), "Lote con id " + lote.getIdLote() + " debe existir.");
        }
        loteDao.eliminar(lote);
        
        return lote;
    }
    
    @Override
    public List<Lote> listarTodosLotes(String usuario, String password) throws AtributoInvalidoException, Exception {
        ejbRefUsuario.existeUsuario(usuario, password);
        try {
            return loteDao.listarTodos();
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }

    @Override
    public Lote obtenerLotePorId(int idLote, String usuario, String password) throws AtributoInvalidoException, Exception {
        ejbRefUsuario.existeUsuario(usuario, password);
        try {
            return loteDao.obtenerPorId(idLote);
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }
}
